iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
Security

《Nyahello!從零開始的 30 天 malware 學習日誌》系列 第 7

【Day 7】組語初探!了解 malware 進階靜態分析架構

  • 分享至 

  • xImage
  •  

前言

在前面的介紹中,我們已經學會了惡意程式基礎的靜態與動態分析,不過這樣提供的資訊還不足以讓我們完全地完成一個惡意程式的分析。基礎的靜態分析像是透過一個人的衣服去猜測一個人的體態,但是無法建立一個人完整的樣貌,舉例來說,我們可能像前幾天一樣在分析的時候看到惡意程式導入了某些函式,但是我們只靠這樣無法判斷是否該函式真的會被執行以及會如何被執行等資訊。而基礎的動態分析也一樣有其限制,基礎的動態分析可以觀察惡意程式收到某種網路封包後會做什麼,但是無法看出這個封包為什麼要長這樣、每個欄位代表什麼,要了解這些資訊就要進行反組譯,也就是去看今天要學習的組合語言!

組合語言

以前一打開 IDA,看到組語就覺得頭痛,所以只會直接按 F5 看還原的程式碼,不然完全看不懂XD,所以今天就用最簡單的概念來介紹:

抽絲剝繭

在傳統的電腦架構中,一個電腦系統可以被表示成多個抽象層級,這些抽象層可以把底層的實作細節隱藏起來。例如,Windows 作業系統可以在許多不同種類的硬體上執行,因為底層硬體的具體差異已經被抽象化,使作業系統不需要直接處理每一種硬體的實作細節,舉例來說,我們在 Chrome 下載東西的時候,並不需要知道 SSD 是甚麼牌子的等等資訊,會交給底層去處理。底層差異會透過硬體介面、驅動程式等機制被處理掉。

https://ithelp.ithome.com.tw/upload/images/20260902/20183878mLni1iCV8U.png

而在惡意程式中,製作惡意程式的人先以高階語言撰寫,並使用編譯器產生電腦看得懂的機器語言去讓 CPU 運行。我們為了分析惡意程式則是要將機器語言轉為人類比較看得懂的組合語言,讓我們可以分析並了解一個惡意程式如何運作。

六個抽象層級

一般來說,電腦系統可以用六個不同的抽象層級來描述,以下會從最底層開始列出這些層級:

1. Hardware(硬體)

硬體層是唯一的實體層級,由電子電路所組成。這些電子電路實作了 XOR、AND、OR、NOT 等邏輯運算子的複雜組合,這些電路被稱為「數位邏輯(digital logic)」。由於硬體具有實體性質,因此軟體無法輕易地直接操控硬體。

2. Microcode(微碼)

微碼層(microcode)也被稱為韌體(firmware)。微碼只能在它被設計來對應的特定電路上運作。它包含許多微指令(microinstructions),這些微指令會將較高層的機器碼轉換,提供一種與硬體進行互動的方式。

3. Machine Code(機器碼)

機器碼層由 opcode(操作碼)所組成。Opcode 是以十六進位數字表示的指令,用來告訴處理器你希望它執行什麼操作。一個機器碼指令通常會透過數個微碼指令來實作,使底層硬體能夠真正執行這段程式碼。當使用高階程式語言撰寫的電腦程式被編譯之後,就會產生機器碼。

4. Low-level Languages(低階語言)

低階語言是電腦架構「指令集(instruction set)」的一種人類可讀版本。最常見的低階語言就是組合語言(Assembly Language)。惡意程式分析人員主要在低階語言這個層級進行分析,因為機器碼對人類而言太難理解。我們會使用反組譯器(disassembler)產生低階語言的文字,其中包含像 mov、jmp 這樣簡單的助記符(mnemonics),且組合語言存在許多不同的語法與形式。

5. High-level Languages(高階語言)

大多數電腦程式設計師都是在高階語言這個層級工作。高階語言對機器層提供了高度的抽象,使程式設計師可以更容易使用程式邏輯以及流程控制機制。高階語言包括 C、C++ 等,這些語言通常會透過編譯器,經由編譯的過程轉換成機器碼。

6. Interpreted Languages(直譯語言)

直譯語言位於最上層。許多程式設計師使用 C#、Perl、.NET 和 Java 等直譯語言。這個層級的程式碼不會直接被編譯成機器碼,而是會被轉換成 Bytecode,Bytecode 是一種中間表示形式(intermediate representation),並且與特定的程式語言相關。Bytecode 會在直譯器(interpreter)中執行。直譯器是一個程式,它會在程式執行期間,即時將 bytecode 轉換成可以執行的機器碼。與傳統的編譯程式碼相比,直譯器提供了一層自動化的抽象,因為它可以自行處理錯誤與記憶體管理,而不需要依賴作業系統。

逆向工程

當惡意程式儲存在磁碟上時,通常會以二進位形式存在,並且處於 machine code 這個層級,因為機器碼是一種電腦能夠快速且有效率執行的程式碼形式。當我們對惡意程式進行反組譯時,會將惡意程式的二進位檔案作為輸入,並產生組合語言程式碼作為輸出,而這通常是透過像 IDA 這種反組譯器完成的。組合語言實際上是一整類語言的統稱。每一種組合語言的各自語言(assembly dialect)通常都是用來對應某一個特定的微處理器家族,例如 x86、x64、SPARC、PowerPC、MIPS 和 ARM。不同 CPU 架構有自己的指令集,所以會對應不同的 Assembly,而其中,x86 是個人電腦(PC)領域中最普及的架構。大多數 32 位元個人電腦都採用 x86 架構,x86 也被稱為 Intel IA-32,而所有現代的 32 位元 Microsoft Windows 都是設計來執行於 x86 架構上的。此外,大多數執行 Windows 的 AMD64 或 Intel 64 架構,也支援執行 x86 的 32 位元二進位程式,基於這個原因,大多數惡意程式都是針對 x86 架構編譯的,所以這裡會主要針對 x86 架構進行介紹。

x86 架構

大部分的現代電腦架構中都遵循著 Von Neumann architecture,如下圖所示

https://ithelp.ithome.com.tw/upload/images/20260902/20183878MpP9vKVcbd.png

其中主要有三個硬體元件:

  1. CPU,負責執行程式碼
  2. 主要記憶體儲存所有資料及程式碼
  3. I/O 針對所有裝置如硬碟、鍵盤和螢幕等提供介面

CPU 包含數個組成部分,Control Unit 會使用一個稱為 Instruction Pointer 的暫存器,從 RAM 中取得接下來要執行的指令。Instruction Pointer 裡面儲存的是下一個要執行的指令所在的記憶體位址。暫存器(Registers)是 CPU 最基本的資料儲存單元。它們經常被用來暫時保存資料,以節省時間,這樣 CPU 就不需要頻繁地存取 RAM。Arithmetic Logic Unit(ALU)會執行從 RAM 取得的指令,並將執行結果存放到暫存器或記憶體中。當程式執行時,「取得指令 → 執行指令」的過程會一再重複,一條接著一條地執行。

舉例來說,假設 RAM 裡有:

mov eax, 5
add eax, 3

CPU 大致會:

  1. Instruction Pointer 指向 mov eax, 5
  2. Control Unit 從 RAM 取得它
  3. 執行後,把 5 放進 EAX 暫存器
  4. 接著 Instruction Pointer 指向 add eax, 3
  5. ALU 計算 5 + 3
  6. 結果 8 再放回 EAX

主記憶體

一個單一程式的主記憶體可以被分為以下幾個段落,如下圖:

https://ithelp.ithome.com.tw/upload/images/20260902/201838784GoABuiOSP.png

Data(資料)

Data 可以用來指記憶體中一個特定的區域,稱為資料區(data section),其中包含程式一開始被載入時,就已經放置好的數值。這些數值有時被稱為靜態值(static values),因為它們在程式執行期間可能不會改變,也可能被稱為全域值(global values),因為程式中的任何部分都可以存取它們。

Code(程式碼區)

Code 包含 CPU 為了執行程式工作而取得的指令。這些程式碼會控制程式要做什麼,以及程式中的各項工作要如何被安排與執行。

Heap(堆積)

Heap 用於程式執行期間的動態記憶體,可以用來建立新的數值,也可以釋放程式已經不再需要的數值。Heap 被稱為動態記憶體,是因為在程式執行期間,它的內容可能會頻繁地改變。

Stack(堆疊)

Stack 用來儲存函式的區域變數與參數,同時也協助控制程式的執行流程。

以上雖然將記憶體中的四個主要區域按照特定順序排列,但這些區域實際上可能分布在記憶體中的不同位置,像是 stack 就不一定在 code 下面。

結語

今天就先簡單介紹到這邊!先大致上講完組合語言的架構以後,明天再來介紹更深入的指令、opcode、運算元、暫存器與 stack 等等!

參考資料

  • Practical Malware Analysis (Chapter 4)

本日貓味

https://ithelp.ithome.com.tw/upload/images/20260902/20183878UmTqc6b429.jpg


上一篇
【Day 6】透過動態分析工具觀察 malware 行為!
下一篇
【Day 8】解構組語!認識指令語法與暫存器
系列文
《Nyahello!從零開始的 30 天 malware 學習日誌》9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言